//============================================================================
/**
 *
 *	@file		encount_effect_yasei.h
 *	@brief		エンカウントエフェクト パタパタ系（GS野生)
 *	@author		nagihasi toru (GS)
 *	@author		hosaka genya (GS)
 *	@data		2009.03.05
 *
 */
//============================================================================
#pragma once

#undef GLOBAL
#ifdef	__ECCOUNT_EFFECT_YASEI_H_GLOBAL
#define	GLOBAL	/* */
#else
#define	GLOBAL	extern
#endif

//=============================================================================
/**
 *	以下、名木橋追加分	080516~
 */
//=============================================================================

//-------------------------------------
//	BMP関係
//=====================================

// ビットマップウィンドウ塗りつぶし拡大オブジェクト			・→■	へぬりつぶされる	|→■　や　―→■も可
typedef struct _ENC_BMP_FILL_SPREAD ENC_BMP_FILL_SPREAD;

GLOBAL ENC_BMP_FILL_SPREAD* ENC_BMP_FillSpreadAlloc( u32 heapID );
GLOBAL void ENC_BMP_FillSpreadDelete( ENC_BMP_FILL_SPREAD* p_work );
GLOBAL void ENC_BMP_FillSpreadStart(  ENC_BMP_FILL_SPREAD* p_work, int x, int y, int sync, GF_BGL_BMPWIN* p_bmp, int s_w, int s_h, int e_w, int e_h, u8 col );
GLOBAL BOOL ENC_BMP_FillSpreadMain( ENC_BMP_FILL_SPREAD* p_work );

//	手書き再現オブジェクト
typedef struct _ENC_HAND_DRAW ENC_HAND_DRAW;

GLOBAL ENC_HAND_DRAW* ENC_HandDrawAlloc( u32 heapID );
GLOBAL void ENC_HandDrawDelete( ENC_HAND_DRAW *p_work );
GLOBAL void ENC_HandDrawStart( ENC_HAND_DRAW *p_work, const ENC_HAND_DRAW_POS_TBL cp_tbl[], u16 sync );
GLOBAL BOOL ENC_HandDrawGetPosMain( ENC_HAND_DRAW *p_work, s16 *p_x, s16 *p_y );


// BMPランダム塗りつぶしオブジェクト
typedef struct _ENC_BMP_RND_FILL ENC_BMP_RND_FILL;

GLOBAL ENC_BMP_RND_FILL* ENC_BMP_RndFillAlloc( u32 heapID );
GLOBAL void ENC_BMP_RndFillDelete( ENC_BMP_RND_FILL* p_work );
GLOBAL void ENC_BMP_RndFillStart( ENC_BMP_RND_FILL* p_work, u8 start, GF_BGL_BMPWIN* p_bmp, u8 col );
GLOBAL BOOL ENC_BMP_RndFillMain( ENC_BMP_RND_FILL* p_work );

// BMPをCHRでランダムに塗りつぶしていくオブジェクト
typedef struct _ENC_BMP_CHR_FILL ENC_BMP_CHR_FILL;

GLOBAL ENC_BMP_CHR_FILL* ENC_BMP_ChrFillAlloc( u32 heapID, u32 chrIDx );
GLOBAL void ENC_BMP_ChrFillDelete( ENC_BMP_CHR_FILL* p_work );
GLOBAL void ENC_BMP_ChrFillStart( ENC_BMP_CHR_FILL* p_work, u8 start, GF_BGL_BMPWIN* p_bmp, u8 col );
GLOBAL BOOL ENC_BMP_ChrFillMain( ENC_BMP_CHR_FILL* p_work );

//	BMPをブラシで塗りつぶしていくオブジェクト
typedef struct _ENC_BMP_CHR_BRUSH ENC_BMP_CHR_BRUSH;

GLOBAL ENC_BMP_CHR_BRUSH* ENC_BMP_ChrBrushAlloc( u32 heapID, u32 chrIdx );
GLOBAL void ENC_BMP_ChrBrushDelete( ENC_BMP_CHR_BRUSH *p_work );
GLOBAL void ENC_BMP_ChrBrushStart( ENC_BMP_CHR_BRUSH *p_work, u8 piece_sync, u16 chr_w, GF_BGL_BMPWIN* p_bmp, u8 col );
GLOBAL BOOL ENC_BMP_ChrBrushMain( ENC_BMP_CHR_BRUSH *p_work );

//	手書き再現	BMPをブラシで塗りつぶしていくオブジェクト
typedef struct _ENC_BMP_HAND_BRUSH ENC_BMP_HAND_BRUSH;

GLOBAL ENC_BMP_HAND_BRUSH* ENC_BMP_HandBrushAlloc( u32 heapID, u32 chrIdx );
GLOBAL void ENC_BMP_HandBrushDelete( ENC_BMP_HAND_BRUSH *p_work );
GLOBAL void ENC_BMP_HandBrushStart( ENC_BMP_HAND_BRUSH *p_work, GF_BGL_BMPWIN* p_bmp, u8 col );
GLOBAL BOOL ENC_BMP_HandBrushMain( ENC_BMP_HAND_BRUSH *p_work );

//	BMPでパタパタと塗りつぶされていくオブジェクト
typedef struct _ENC_BMP_PATAPATA_FILL ENC_BMP_PATAPATA_FILL;

GLOBAL ENC_BMP_PATAPATA_FILL* ENC_BMP_PatapataFillAlloc( u32 heapID );
GLOBAL void ENC_BMP_PatapataFillDelete( ENC_BMP_PATAPATA_FILL *p_work );
GLOBAL void ENC_BMP_PatapataFillStart( ENC_BMP_PATAPATA_FILL* p_work, u8 one_start_sync, u8 one_fill_sync, GF_BGL_BMPWIN* p_bmp, u8 col, BOOL b_morning );
GLOBAL BOOL ENC_BMP_PatapataFillMain( ENC_BMP_PATAPATA_FILL *p_work );
//	以下テスト用です。
GLOBAL BOOL ENC_BMP_PatapataFillMain1( ENC_BMP_PATAPATA_FILL *p_work );
GLOBAL BOOL ENC_BMP_PatapataFillMain2( ENC_BMP_PATAPATA_FILL *p_work );
GLOBAL BOOL ENC_BMP_PatapataFillMain3( ENC_BMP_PATAPATA_FILL *p_work );
//	以上

//-------------------------------------
//	動作
//=====================================
//	サイン幅で揺れる
typedef struct {
	s16 x;
	s16 s_x;
	s16 dist;
	s16	add;
	u16 count;
} ENC_SHAKEMOVE_WORK;
GLOBAL void ENC_SinShakeMoveReq( ENC_SHAKEMOVE_WORK* p_work, s16 s_x, s16 e_x, s16 add );
GLOBAL void	ENC_SinShakeMoveMain( ENC_SHAKEMOVE_WORK* p_work );

//-------------------------------------
//	キャプチャ類
//=====================================
typedef enum {
	ENC_CAPTURE_USE_VRAM_A,
	ENC_CAPTURE_USE_VRAM_B,
	ENC_CAPTURE_USE_VRAM_C,
	ENC_CAPTURE_USE_VRAM_D,
} ENC_CAPTURE_USE_VRAM;

typedef struct {
	// キャプチャに使用するVRAM
	ENC_CAPTURE_USE_VRAM use_vram;

	//	現在のグラフィックモード
	GXDispMode	dispMode;	// グラフィックモード
	GXBGMode	bgMode;		// BGモード
	GXBG0As		bg0_2d3d;	// BG0を3dに使用するか

	// キャプチャ設定
	GXCaptureSize	sz;		// キャプチャサイズ
    GXCaptureMode	mode;	// キャプチャモード
    GXCaptureSrcA	a;		// キャプチャ先A
    GXCaptureSrcB	b;		// キャプチャ先B
    GXCaptureDest	dest;	// キャプチャデータ転送Vram
    int	eva;				// ブレンド係数A
	int	evb;				// ブレンド係数B
}ENC_CAPTURE_PARAM;

typedef struct _ENC_CAPTURE ENC_CAPTURE;

GLOBAL ENC_CAPTURE * ENC_CAPTURE_Create( u32 heapID, const ENC_CAPTURE_PARAM *cp_param );
GLOBAL void ENC_CAPTURE_Execute( ENC_CAPTURE *p_capture );
GLOBAL void ENC_CAPTURE_Delete( ENC_CAPTURE *p_capture );
GLOBAL void ENC_CAPTURE_DrawCapture( ENC_CAPTURE *p_capture );
GLOBAL void ENC_CAPTURE_DrawReturn( ENC_CAPTURE *p_capture );
GLOBAL void * ENC_CAPTURE_GetCaptureVramAddr( const ENC_CAPTURE *cp_capture );

//-------------------------------------
//	曲同期
//=====================================
//	任意のカウント中、任意のタイミングをとる
typedef struct {
	s16 var_start;
	s16 var_end;
	fx32 fx_timing;
	u32 tick_start;
	u32 tick_add;
	s16 pre_var;
	u16	init_flg;
}ENC_SYNCBGM_TIMING_WORK;

//	指定範囲内カウントで、任意のタイミングをとる
//	ex)	３〜７のカウント中に0.5ずつタイミングをとる、とか。開始はStartと同義
#define ENC_SYNCBGM_TIMING_BGMEND	( 0xFFFF )	//	var_endに入れると、カウント終了と同義
GLOBAL void ENC_SyncBgmTimingReq( ENC_SYNCBGM_TIMING_WORK* p_work, s16 var_end, fx32 timing );
GLOBAL BOOL ENC_SyncBgmTimingSearch( ENC_SYNCBGM_TIMING_WORK* p_work );
GLOBAL BOOL ENC_SyncBgmTimingMain( ENC_SYNCBGM_TIMING_WORK* p_work, BOOL *p_timing_flg );

//	曲に同期し、塗りつぶす
typedef struct _ENC_BMP_SYNCBGM_RNDFILL ENC_BMP_SYNCBGM_RNDFILL;

GLOBAL ENC_BMP_SYNCBGM_RNDFILL* ENC_BMP_SYNCBGM_RndFillAlloc( u32 heapID );
GLOBAL void ENC_BMP_SYNCBGM_RndFillDelete( ENC_BMP_SYNCBGM_RNDFILL* p_work );
GLOBAL void ENC_BMP_SYNCBGM_RndFillStart( ENC_BMP_SYNCBGM_RNDFILL* p_work, s16 var_end, s16 timing, GF_BGL_BMPWIN* p_bmp, u8 col );
GLOBAL BOOL ENC_BMP_SYNCBGM_RndFillMain( ENC_BMP_SYNCBGM_RNDFILL* p_work );

//	曲に同期し、パタパタで塗りつぶす
typedef struct _ENC_BMP_SYNCBGM_PATAFILL ENC_BMP_SYNCBGM_PATAFILL;

GLOBAL ENC_BMP_SYNCBGM_PATAFILL* ENC_BMP_SYNCBGM_PataFillAlloc( u32 heapID );
GLOBAL void ENC_BMP_SYNCBGM_PataFillDelete( ENC_BMP_SYNCBGM_PATAFILL* p_work );
GLOBAL void ENC_BMP_SYNCBGM_PataFillStart( ENC_BMP_SYNCBGM_PATAFILL* p_work, s16 var_end, fx32 timing, GF_BGL_BMPWIN* p_bmp, u8 col );
GLOBAL BOOL ENC_BMP_SYNCBGM_PataFillMain( ENC_BMP_SYNCBGM_PATAFILL* p_work );
GLOBAL BOOL ENC_BMP_SYNCBGM_PataFillMain1( ENC_BMP_SYNCBGM_PATAFILL* p_work );
GLOBAL BOOL ENC_BMP_SYNCBGM_PataFillMain2( ENC_BMP_SYNCBGM_PATAFILL* p_work );
GLOBAL BOOL ENC_BMP_SYNCBGM_PataFillMain3( ENC_BMP_SYNCBGM_PATAFILL* p_work );

//=============================================================================
/**
 *								extern
 */
//=============================================================================
extern void EncountEffect_Field_GrassMorning(TCB_PTR tcb, void * work );
extern void EncountEffect_Field_GrassNight(TCB_PTR tcb, void * work );
extern void EncountEffect_Field_WaterMorning(TCB_PTR tcb, void * work );
extern void EncountEffect_Field_WaterNight(TCB_PTR tcb, void * work );
extern void EncountEffect_Field_DanMorning(TCB_PTR tcb, void * work );
extern void EncountEffect_Field_DanNight(TCB_PTR tcb, void * work );

extern void EncountEffect_Test_Patapata1(TCB_PTR tcb, void * work );
extern void EncountEffect_Test_Patapata2(TCB_PTR tcb, void * work );
extern void EncountEffect_Test_Brush(TCB_PTR tcb, void* work);
extern void EncountEffect_Test_Old(TCB_PTR tcb, void* work);

//=============================================================================
/**
 *								構造体定義
 */
//=============================================================================

//=============================================================================
/**
 *								プロトタイプ宣言
 */
//=============================================================================

